/*
Automatic clinic tests using a robot arm.
Copyright (C) 2010  CIC-CPC, CHU Gabriel Montpied
All other trademarks, logos and copyrights are the property
of their respective owners.

This file is part of cpc-painbot.

cpc-painbot is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

cpc-painbot is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with cpc-painbot.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef CPC_PAINBOT_PILOTABLESERIE_H
#define CPC_PAINBOT_PILOTABLESERIE_H
#include "pilotable.h"

class AbstractSerial;

/*! Objet Pilotable au travers d'une liaison série.
    Un PilotableSerie est objet qui est piloté via une liaison
    série - typiquement RS232.
*/
class PilotableSerie : public Pilotable
{
    Q_OBJECT
    //! Port sur lequel ce Pilotable est connecté.
    Q_PROPERTY(QString port READ port WRITE setPort)
public:
    //! Constructeur.
    PilotableSerie(QObject *parent = 0);
    //! Destructeur.
    ~PilotableSerie();

    /*! Port série.
        Indique le port sur lequel l'objet est actuellement relié.

        \return Le port série courant.
    */
    QString port(void) const;


public slots:
    /*! Ouvre/Ferme la connection.
        Ouvre ou Ferme la liaison pour l'émission-réception de données.

        \param[in] on False: déconnecte, True: connecte
    */
    void connecter(bool on);

    //! Etablir la connection.
    void connecter();

    //! Fermer la connection.
    void deconnecter();

    /*! Définit le port.
        Définit le port série au travers duquel la communication s'effectue.

        \param[in] port Port de communication.
    */
    void setPort(const QString &port);

    /*! Envoie la commande sur le port série.
        Sérialise la commande et l'envoie sur la liaison série.
        \see Pilotable::envoyer()
    */
    virtual void envoyer(const commande::Commande *cmd);

protected slots:
    /*! Reçoit les données issues du port série.
        Lorsque des données sont disponibles, celles-ci sont lues et stockées dans un buffer.
        Si une Commande adéquate peut en être extraite, elle est retirée du buffer, parsée, et
        le signal correspondant Pilotable::reponse() est émis, adjoint de la commande.
        D'autres signaux, propres à l'objet, peuvent également être émis en parallèle.
    */
    void lireDonnees();

protected:
    /*! Configure la liaison série.
        Paramètre la liaison série. Par défaut, utilise des valeurs courantes pour certains
        paramètres :
        \li 8 bits de données.
        \li 1 bit de stop.
        \li Contrôle de Flux Off.
        \li Pas de parité.
    */
    virtual void configurerLiaison();

    /*! Indique si le buffer contient une Commande.
        Indique si le buffer contient (au moins) une Commande que
        l'objet peut exécuter.

        \retval true    Le buffer contient une Commande
        \retval false   Le buffer ne contient pas de Commande.
    */
    virtual bool hasCommande(void) const = 0;

    /*! Extrait une Commande du buffer.
        Extrait une Commande du buffer et effectue les actions nécessaires.
    */
    virtual void parserCommande(void) = 0;

    AbstractSerial *serie_; //!< Liaison sÃ©rie.
    QString buffer_; //!< Tampon de rÃ©ception.
};

#endif // CPC_PAINBOT_PILOTABLESERIE_H
